import View from "./View";
import Model from "./Model";

export default class Controller {

    ////////////////////////////////////////////////////////////////////////////
    //  constructor
    ////////////////////////////////////////////////////////////////////////////
    constructor(cmd) {
        if (Controller.hasController(cmd)) {
            throw new Error('Controller cmd [' + cmd + '] instance already constructed !');
        }
        this.cmd = cmd;
        Controller.controllerList.push(this);
        this.onRegister();
    }

    ////////////////////////////////////////////////////////////////////////////
    //  private static methods
    ////////////////////////////////////////////////////////////////////////////

    static notifyControllers(cmd, data = null, sponsor = null) {
        var i = 0;
        while (i < Controller.controllerList.length) {
            if (Controller.controllerList[i].cmd === cmd) {
                // 执行一个或多个命令（FIFO）
                Controller.controllerList[i].execute(data, sponsor);
            }
            i++;
        }
    }

    static hasController(cmd) {
        var len = Controller.controllerList.length;
        for (var i = 0; i < len; ++i) {
            if (Controller.controllerList[i].cmd === cmd) {
                return true;
            }
        }
        return false;
    }

    static removeController(cmd) {
        var len = Controller.controllerList.length;
        for (var i = len - 1; i >= 0; --i) {
            if (Controller.controllerList[i].cmd === cmd) {
                // 注销附加操作
                Controller.controllerList[i].onRemove();
                Controller.controllerList[i] = null;
                // 确保controller总是非空
                Controller.controllerList.splice(i, 1);
                return true;
            }
        }
        return false;
    }

    ////////////////////////////////////////////////////////////////////////////
    //  public methods
    ////////////////////////////////////////////////////////////////////////////

    /**
     * 注册附加操作，需在子类中覆盖使用
     */
    onRegister() {
        // overwrite
    }

    /**
     * 注销附加操作，需在子类中覆盖使用
     */
    onRemove() {
        // overwrite
    }

    /**
     * 执行Controller逻辑处理，需在子类中覆盖使用
     */
    execute(data = null, sponsor = null) {
        // overwrite
    }

    sendEvent(cmd, data = null, strict = false) {
        if (!strict) {
            View.notifyViews(cmd, data, this);
        }
        Controller.notifyControllers(cmd, data, this);
    }

    registerView(name, viewClass, viewComponent) {
        return new viewClass(name, viewComponent);
    }

    retrieveView(name) {
        return View.retrieveView(name);
    }

    removeView(name) {
        View.removeView(name);
    }

    registerController(cmd, controllClass) {
        return new controllClass(cmd);
    }

    removeController(cmd) {
        Controller.removeController(cmd);
    }

    registerModel(name, modelClass, data = null) {
        return new modelClass(name, data);
    }

    retrieveModel(name) {
        return Model.retrieveModel(name);
    }

    removeModel(name) {
        Model.removeModel(name);
    }
}


////////////////////////////////////////////////////////////////////////////
// protected static property
////////////////////////////////////////////////////////////////////////////
Controller.controllerList = [];